<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>全排列</title>
</head>
<body>
  <script>
    const arr = ['a', 'b', 'c', 'd']
    function fn(arr) {
      let len = arr.length
      let res = [] // 所有排列结果
      //  tempArr：排列好的元素，leftArr：待排列元素
      function num(tempArr, leftArr) {
        if (tempArr.length === len) { // 这里就是递归结束的地方
          // res.push(tempArr) // 得到全排列的每个元素都是数组
          res.push(tempArr.join('')) // 得到全排列的每个元素都是字符串
        } else {
          leftArr.forEach((item, index) => {
            let temp = [].concat(leftArr)
            temp.splice(index, 1)
            // 第一个参数是当前分离出的元素所在数组
            // 第二个参数temp是传入的leftArr去掉第一个后的结果
            num(tempArr.concat(item), temp) // 这里使用了递归
          })
        }
      }
      num([], arr)
      return res
    }
    console.log('结果：', fn(arr))
  </script>
</body>
</html>